package com.example.deepseek.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 消息实体类
 * 表示对话中的单个消息
 */
@Data
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL) // 不序列化null值
public class Message {

    private Integer id;
    private String sessionId;
    private String role;
    private String content;

    // 使用JsonFormat注解指定日期时间格式
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime timestamp;

    private Integer deleted;

    // 文件相关属性
    private byte[] fileContent;  // 二进制文件内容
    private String textContent;  // 文本文件内容 (新增)
    private String filePath;
    private String fileName;

    /**
     * 基本构造函数
     */
    public Message(String role, String content) {
        this.role = role;
        this.content = content;
    }

    /**
     * 构造包含文件的消息
     */
    public Message(String role, String content, String fileName) {
        this.role = role;
        this.content = content;
        this.fileName = fileName;
    }

    /**
     * 提供给API调用的简化版本，不包含时间戳
     * 避免Jackson序列化LocalDateTime的问题
     */
    @JsonIgnore
    public Message getApiVersion() {
        Message apiMessage = new Message(this.role, this.content);
        // 不包含时间戳和其他不必要的字段
        return apiMessage;
    }

    /**
     * 获取文件内容（若存在），优先返回文本内容
     */
    @JsonIgnore
    public String getFileContentAsString() {
        if (textContent != null && !textContent.isEmpty()) {
            return textContent;
        }
        if (fileContent != null && fileContent.length > 0) {
            try {
                return new String(fileContent, "UTF-8");
            } catch (Exception e) {
                return null;
            }
        }
        return null;
    }

    /**
     * 检查消息是否包含文件内容
     */
    @JsonIgnore
    public boolean hasFileContent() {
        return (fileName != null && !fileName.isEmpty()) &&
                ((fileContent != null && fileContent.length > 0) ||
                        (textContent != null && !textContent.isEmpty()));
    }
}